Bingo, Computer Graphics & Game Developer

ImpluseEngine中的直线求交点方程

1.

原式中已知两点都是位于交点的两侧

这样也就求出了最后的结果

2.

这里Dot(n, face[0]) - c得到的方程式其实并不是将face[0]代入到ax+by+cax + by + c

而是代入到于ax+by+cax + by + c垂直的真实裁剪线中去的

这里有多重方法可以证明 因为两种Clip情况都相似 所以只取一种情况予以证明

(1).

n=(x1x2,y1y2)c=[x1.(x2x1)+y1.(y2y1)]n = (x1 - x2, y1 - y2) c = -[x1 \ldotp (x2 - x1) + y1 \ldotp (y2 - y1)]

n.(x,y)c=(x1x2).x+(y1y2).y+x1.(x2x1)+y1.(y2y1)=(x2x1).(xx1)+(y2y1).(yy1)n \ldotp (x, y) - c = (x1 - x2) \ldotp x + (y1 - y2) \ldotp y + x1 \ldotp (x2 - x1) + y1 \ldotp (y2 - y1) = (x2 - x1) \ldotp (x - x1) + (y2 - y1) \ldotp (y - y1)

这个式子是两个向量的点积

这里的几何意义就表明

(2).上一则方法是一步步推导实现的

第二种方法是直接给出这条真实裁剪线的方程 因为垂直 所以斜率乘积为-1 已知直线斜率为 k=abk = -\frac{a}{b}

那么所求直线斜率为 k=bak = \frac{b}{a} 并且过(x1,y1)(x1, y1) (两点式已知a = y2 - y1, b = x1 - x2

可得 k.x+y1k.x1=yk \ldotp x + y1 - k \ldotp x1 = y

最终式子为

(x1x2).x+y1.(y2y1)(x1x2).x1=y.(y2y1)(x1 - x2) \ldotp x + y1 \ldotp (y2 - y1) - (x1 - x2) \ldotp x1 = y \ldotp (y2 - y1)

(x1x2).(xx1)=(yy1)(y2y1)(x1 - x2) \ldotp (x - x1) = (y - y1)(y2 - y1)也就是第一种情况中所求得的式子 可以证明得到Dot(n, face[0]) - c得到的方程式的的确确就是垂直于已知直线并且过(x1,y1)(x1, y1)点的直线

2.

在最后计算深度的时候需要注意到的是倘若clip计算出来的边长都在reference face内部 那么两点都为contact point